#include "W6100_hard_init.h"
void w6100_comm_interface_init(void)
{
    W6100_SPI1_Init();
    W6100_CS_RST_INT_Init();
    W6100_CS_H();
    W6100_RST_H();
    // W6100_CS_L();
    // uint8_t val = W6100_SPI1_RW(0x00); // 发哑码，读回数据
    // W6100_CS_H();
}
void W6100_SPI1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef SPI_InitStructure;

    // 1. 使能时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOG, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

    // 2. 配置 PB3/PB4/PB5 为复用功能
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // 3. 配置复用功能映射
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1); // SCK
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1); // MISO
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1); // MOSI

    // 4. 配置 PG13 为片选引脚（软件控制）
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOG, &GPIO_InitStructure);

    GPIO_SetBits(GPIOG, GPIO_Pin_13); // 默认拉高，禁用从设备

    // 5. 配置 SPI1 参数
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI1, &SPI_InitStructure);

    // 6. 使能 SPI1
    SPI_Cmd(SPI1, ENABLE);
}
uint8_t W6100_SPI1_RW(uint8_t byte)
{
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
        ;
    SPI_I2S_SendData(SPI1, byte);

    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
        ;
    return SPI_I2S_ReceiveData(SPI1);
}

void W6100_CS_RST_INT_Init(void)
{
    GPIO_InitTypeDef gpio;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
    /* 3. PG13 CS / PG14 RST 推挽输出；PG15 INT 输入 */
    gpio.GPIO_Mode = GPIO_Mode_OUT;
    gpio.GPIO_OType = GPIO_OType_PP;
    gpio.GPIO_PuPd = GPIO_PuPd_UP;
    gpio.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
    GPIO_Init(GPIOG, &gpio);
    gpio.GPIO_Mode = GPIO_Mode_IN;
    gpio.GPIO_PuPd = GPIO_PuPd_UP;
    gpio.GPIO_Pin = GPIO_Pin_15;
    GPIO_Init(GPIOG, &gpio);

    /* 初始状态：CS=1  RST=1 */
    W6100_CS_H();
    W6100_RST_H();
}
// uint8_t softSPI_RW(uint8_t tx)
// {
//     uint8_t rx = 0;
//     for (uint8_t i = 0; i < 8; i++)
//     {
//         /* 主机先放数据 */
//         if (tx & 0x80)
//             MOSI_H();
//         else
//             MOSI_L();
//         tx <<= 1;

//         spi_delay(); // 建立时间
//         CLK_H();     // 上升沿采样
//         spi_delay();

//         /* 读 MISO */
//         rx <<= 1;
//         if (MISO_READ())
//             rx++;

//         CLK_L(); // 下降沿结束
//         spi_delay();
//     }
//     return rx;
// }

// static void spi_delay(void)
// {
//     volatile uint32_t d = 42; // 调这里改变速度
//     while (d--)
//         ;
// }
// void W6100_SPI_hard_init(void)
// {
//     W6100_spi_gpio_init();
//     W6100_SPI_Config();
//     //    CS_L();                           // 选中
//     //    uint8_t val = W6100_SPI_RW(0x00); // 发哑码，读回数据
//     //    CS_H();                           // 释放
// }
// void W6100_spi_gpio_init(void)
// {
//     GPIO_InitTypeDef gpio;

//     //    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
//     //    SYSCFG->MEMRMP |= (2 << SYSCFG_MEMRMP_SWJ_CFG_Pos);

//     /* 1. 时钟：SPI3 在 APB1，GPIOB 在 AHB1 */
//     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
//     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); // 注意 APB1

//     /* 2. PB3/PB4/PB5 复用 AF6 = SPI3 */
//     GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI3); // SCK
//     GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI3); // MISO
//     GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI3); // MOSI

//     /* 3. 统一配置 */
//     gpio.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
//     gpio.GPIO_Mode = GPIO_Mode_AF;
//     gpio.GPIO_OType = GPIO_OType_PP;
//     gpio.GPIO_PuPd = GPIO_PuPd_UP;
//     gpio.GPIO_Speed = GPIO_Speed_50MHz;
//     GPIO_Init(GPIOB, &gpio);

//     /* 3. PG13 CS / PG14 RST 推挽输出；PG15 INT 输入 */
//     gpio.GPIO_Mode = GPIO_Mode_OUT;
//     gpio.GPIO_OType = GPIO_OType_PP;
//     gpio.GPIO_PuPd = GPIO_PuPd_UP;
//     gpio.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
//     GPIO_Init(GPIOG, &gpio);

//     gpio.GPIO_Mode = GPIO_Mode_IN;
//     gpio.GPIO_PuPd = GPIO_PuPd_UP;
//     gpio.GPIO_Pin = GPIO_Pin_15;
//     GPIO_Init(GPIOG, &gpio);

//     /* 初始状态：CS=1  RST=1 */
//     GPIO_SetBits(GPIOG, GPIO_Pin_13 | GPIO_Pin_14);
// }
// void W6100_SPI_Config(void)
// {
//     SPI_InitTypeDef spi;
//     SPI_StructInit(&spi);
//     spi.SPI_Mode = SPI_Mode_Master;
//     spi.SPI_DataSize = SPI_DataSize_8b;
//     spi.SPI_CPOL = SPI_CPOL_Low;
//     spi.SPI_CPHA = SPI_CPHA_1Edge;
//     spi.SPI_NSS = SPI_NSS_Soft;
//     spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
//     spi.SPI_FirstBit = SPI_FirstBit_MSB;
//     SPI_Init(SPI3, &spi);
//     SPI_Cmd(SPI3, ENABLE);
// }

// uint8_t W6100_SPI_RW(uint8_t tx)
// {
//     while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET)
//         ;
//     SPI_I2S_SendData(SPI3, tx);
//     while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)
//         ;
//     return SPI_I2S_ReceiveData(SPI3);
// }
